# -*- Mode: Python -*-
# vim: filetype=python
#

##
# = TPM (trusted platform module) devices
##

##
# @TpmModel:
#
# An enumeration of TPM models
#
# @tpm-tis: TPM TIS model
# @tpm-crb: TPM CRB model (since 2.12)
# @tpm-spapr: TPM SPAPR model (since 5.0)
#
# Since: 1.5
##
{ 'enum': 'TpmModel', 'data': [ 'tpm-tis', 'tpm-crb', 'tpm-spapr' ],
  'if': 'CONFIG_TPM' }

##
# @query-tpm-models:
#
# Return a list of supported TPM models
#
# Returns: a list of TpmModel
#
# Since: 1.5
#
# Example:
#
# -> { "execute": "query-tpm-models" }
# <- { "return": [ "tpm-tis", "tpm-crb", "tpm-spapr" ] }
#
##
{ 'command': 'query-tpm-models', 'returns': ['TpmModel'],
  'if': 'CONFIG_TPM' }

##
# @TpmType:
#
# An enumeration of TPM types
#
# @passthrough: TPM passthrough type
# @emulator: Software Emulator TPM type
#            Since: 2.11
#
# Since: 1.5
##
{ 'enum': 'TpmType', 'data': [ 'passthrough', 'emulator' ],
  'if': 'CONFIG_TPM' }

##
# @query-tpm-types:
#
# Return a list of supported TPM types
#
# Returns: a list of TpmType
#
# Since: 1.5
#
# Example:
#
# -> { "execute": "query-tpm-types" }
# <- { "return": [ "passthrough", "emulator" ] }
#
##
{ 'command': 'query-tpm-types', 'returns': ['TpmType'],
  'if': 'CONFIG_TPM' }

##
# @TPMPassthroughOptions:
#
# Information about the TPM passthrough type
#
# @path: string describing the path used for accessing the TPM device
#
# @cancel-path: string showing the TPM's sysfs cancel file
#               for cancellation of TPM commands while they are executing
#
# Since: 1.5
##
{ 'struct': 'TPMPassthroughOptions',
  'data': { '*path': 'str',
            '*cancel-path': 'str' },
  'if': 'CONFIG_TPM' }

##
# @TPMEmulatorOptions:
#
# Information about the TPM emulator type
#
# @chardev: Name of a unix socket chardev
#
# Since: 2.11
##
{ 'struct': 'TPMEmulatorOptions', 'data': { 'chardev' : 'str' },
  'if': 'CONFIG_TPM' }

##
# @TPMPassthroughOptionsWrapper:
#
# Since: 1.5
##
{ 'struct': 'TPMPassthroughOptionsWrapper',
  'data': { 'data': 'TPMPassthroughOptions' },
  'if': 'CONFIG_TPM' }

##
# @TPMEmulatorOptionsWrapper:
#
# Since: 2.11
##
{ 'struct': 'TPMEmulatorOptionsWrapper',
  'data': { 'data': 'TPMEmulatorOptions' },
  'if': 'CONFIG_TPM' }

##
# @TpmTypeOptions:
#
# A union referencing different TPM backend types' configuration options
#
# @type: - 'passthrough' The configuration options for the TPM passthrough type
#        - 'emulator' The configuration options for TPM emulator backend type
#
# Since: 1.5
##
{ 'union': 'TpmTypeOptions',
  'base': { 'type': 'TpmType' },
  'discriminator': 'type',
  'data': { 'passthrough' : 'TPMPassthroughOptionsWrapper',
            'emulator': 'TPMEmulatorOptionsWrapper' },
  'if': 'CONFIG_TPM' }

##
# @TPMInfo:
#
# Information about the TPM
#
# @id: The Id of the TPM
#
# @model: The TPM frontend model
#
# @options: The TPM (backend) type configuration options
#
# Since: 1.5
##
{ 'struct': 'TPMInfo',
  'data': {'id': 'str',
           'model': 'TpmModel',
           'options': 'TpmTypeOptions' },
  'if': 'CONFIG_TPM' }

##
# @query-tpm:
#
# Return information about the TPM device
#
# Returns: @TPMInfo on success
#
# Since: 1.5
#
# Example:
#
# -> { "execute": "query-tpm" }
# <- { "return":
#      [
#        { "model": "tpm-tis",
#          "options":
#            { "type": "passthrough",
#              "data":
#                { "cancel-path": "/sys/class/misc/tpm0/device/cancel",
#                  "path": "/dev/tpm0"
#                }
#            },
#          "id": "tpm0"
#        }
#      ]
#    }
#
##
{ 'command': 'query-tpm', 'returns': ['TPMInfo'],
  'if': 'CONFIG_TPM' }
